package com.example.ad.sdk.domain.view.basic

// 导入必要的类和接口，用于处理 Activity Result API 的相关操作
import androidx.activity.result.ActivityResultCaller
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract

/**
 * BaseActivityLauncher 是一个抽象类，用于封装使用 Activity Result API 启动 Activity 的通用逻辑。
 *
 * @param INPUT  输入类型，表示启动目标 Activity 所需的数据类型。
 * @param OUTPUT 输出类型，表示目标 Activity 返回的数据类型。
 *
 * @param caller     提供注册 Activity Result 的能力的对象（通常是 Activity 或 Fragment）。
 * @param contract   定义了如何准备和处理目标 Activity 的输入输出契约。
 */
abstract class BaseActivityLauncher<INPUT, OUTPUT>(
    caller: ActivityResultCaller,
    contract: ActivityResultContract<INPUT, OUTPUT>
) {

    // 用于启动目标 Activity 的 Launcher 对象
    private val launcher: ActivityResultLauncher<INPUT>

    // 回调函数，用于接收目标 Activity 返回的结果数据
    private var callback: ((OUTPUT) -> Unit)? = null

    /**
     * 初始化块，在对象创建时注册 Activity Result Launcher。
     * 当目标 Activity 返回结果时，会触发传入的回调函数。
     */
    init {
        launcher = caller.registerForActivityResult(contract) {
            if (callback != null) {
                callback?.invoke(it) // 调用回调函数处理返回结果
                callback = null      // 清空回调，避免重复调用
            }
        }
    }

    /**
     * 启动目标 Activity，并设置可选的回调函数来处理返回结果。
     *
     * @param input    启动目标 Activity 所需的输入数据。
     * @param callback 可选的回调函数，用于处理目标 Activity 返回的结果。
     */
    fun launch(input: INPUT, callback: ((OUTPUT) -> Unit)? = null) {
        this.callback = callback // 保存回调函数，供结果返回时调用
        launcher.launch(input)   // 启动目标 Activity
    }
}
